home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-09-27 | 8.9 KB | 264 lines | [TEXT/CCL2] |
- ;;; File: ast/module-structs Author: John
-
- ;;; This contains AST structures which define the basic module structure.
- ;;; This is just the skeleton module structure: module, imports, exports,
- ;;; fixity, and default decls.
-
- ;;; AST nodes defined in the file:
- ;;; module import-decl entity entity-module entity-var entity-con
- ;;; entity-class entity-abbreviated entity-datatype fixity-decl
-
-
-
- ;;; All AST structs inherit from ast-node. Not instantiated directly.
- ;;; The line-number is a back pointer to the source code.
-
- (define-struct ast-node
- (type-template ast-td)
- (slots
- (line-number (type (maybe source-pointer)) (default '#f))))
-
- (define-struct source-pointer
- (slots
- (line (type int))
- (file (type string))))
-
- ;;; <module> -> module <modid> [<exports>] where <body>
- ;;; -> <body>
- ;;;
- ;;; <exports> -> ( <export>, ... <export> )
- ;;;
- ;;; <body> -> { [<impdecls>;] [[<fixdecls>;] <topdecls> [;]] }
- ;;; -> { <impdecls> [;] }
- ;;;
- ;;; <impdecls> -> <impdecl> ; ... ; <impdecl>
- ;;;
- ;;; <fixdecls> -> <fix> ; ... ; <fix>
- ;;;
- ;;; <topdecls> -> <topdecl> ; ... ; <topdecl>
- ;;;
- ;;; <topdecl> -> <synonym-decl>
- ;;; -> <algdata-decl>
- ;;; -> <class-decl>
- ;;; -> <instance-decl>
- ;;; -> <default-decl>
- ;;; -> <sign-decl>
- ;;; -> <valdef>
-
- ;;; The module struct is used to represent the program internally. Binary
- ;;; files containing interface information contain these structures.
- ;;; Most compiler passes operate on this structure. A table maps module
- ;;; names to this structure. Within the module structure, local names are
- ;;; mapped to definitions.
-
- ;;; Modules are also used to represent interfaces & primitives.
- ;;; Some of the module fields may be blank for non-standard modules.
-
- (define-struct module
- (include ast-node)
- (slots
-
- ;; These slots are required.
-
- (name (type symbol))
- (type (type (enum standard interface psuedo-interface extension)))
- (prelude? (type bool) (default '#f)) ; True when symbols define the core
- (interface-module (type (maybe module)) (default '#f))
- ; link to previously compiled interface
-
- ;; The unit is filled in by the compilation system
-
- (unit (type symbol) (default '*undefined*))
-
- ;; The following slots are defined at parse time.
- ;; After a module is dumped, these are all empty.
-
- ;; <exports>, list of exported names
- (exports (type (list entity)) (default '()))
- ;; <impdecls>, local import decls
- (imports (type (list import-decl)) (default '()))
- ;; <fixdecls>, local fixity decls
- (fixities (type (list fixity-decl)) (default '()))
- ;; <synonym-decl>, local type synonym decls
- (synonyms (type (list synonym-decl)) (default '()))
- ;; <algdata-decl>, local data decls
- (algdatas (type (list data-decl)) (default '()))
- ;; <class-decl>, local class decls
- (classes (type (list class-decl)) (default '()))
- ;; <instance-decl>, local instance decls
- (instances (type (list instance-decl)) (default '()))
- ;; <default-decl>, default types
- (derivings (type (list deriving-decl)) (default '()))
- (annotations (type (list annotation)) (default '()))
- (default (type (maybe default-decl)) (default '#f))
- ;; signatures, pattern, function bindings
- (decls (type (list decl)) (default '()))
-
- ;; These slots are filled in by the type-declaration-analysis phase
- ;; after conversion to definition form
-
- (synonym-defs (type (list synonym)) (default '()))
- (alg-defs (type (list algdata)) (default '()))
- (class-defs (type (list class)) (default '()))
- (instance-defs (type (list instance)) (default '()))
-
-
- ;; The import-export stage creates a set of tables which are used for
- ;; imports and exports and local name resolution. All of these tables
- ;; are indexed by names. These tables always deal with definitions.
- ;; Every variable, type, class, instance, and synonym is converted into
- ;; a definition. Blank definitions are created early (in import/export)
- ;; and different aspects of the definitions are filled in as compilation
- ;; progresses. The type-related definitions are filled in during
- ;; declaration analysis. Only definitions are saved when a module is
- ;; written to a file; the ast information is not retained.
-
- ;; Used to avoid copy of Prelude symbols.
- (uses-standard-prelude? (type bool) (default '#f))
- ;; maps symbols in scope to definitions
- (symbol-table (type (table symbol def)) (default (make-table)))
- ;; maps names onto groups.
- (export-table (type (table symbol (list (tuple symbol def))))
- (default (make-table)))
- ;; Note: symbol groups are found in classes and data decls. An
- ;; entire group is denoted by the (..) abbreviation in an entity.
- ;; maps local names onto declared fixities
- (fixity-table (type (table symbol fixity)) (default (make-table)))
- ;; maps defs to local names
- (inverted-symbol-table (type (table symbol symbol)) (default (make-table)))
- ;; Used internally during import-export
- (fresh-exports (type (list (list (tuple symbol def)))) (default '()))
- (exported-modules (type (list module)) (default '()))
-
- ;; These slots are used to support incremental compilation.
-
- ;; vars defined in the module -- not used anymore
- ;; (vars (type (list var)) (default '()))
- ;; for incremental compilation
- (inherited-env (type (maybe module)) (default '#f))
-
- ;; The following slots are for interfaces only
- ;; These store renaming mappings defined in the import decls of
- ;; the interface. Maps local name onto (module, original name).
- (interface-imports (type (list (tuple symbol (typle symbol symbol))))
- (default '()))
- ;; This is a list of the definitions created within an interface
- ;; file - this is checked against actual definitions later.
- (interface-definitions (type (list (tuple symbol (list def))))
- (default '()))
- ;; This holds dangling references from the module.
- (unresolved-symbols (type (list def)) (default '()))
- ;; True when no implementation is required (C / Lisp interfaces)
- (stand-alone? (type bool) (default '#f))
- ))
-
- (define (interface-module? mod)
- (eq? (module-type mod) 'interface))
-
- ;;; <impdecl> -> import <modid> [<impspec>] [renaming <renamings>]
- ;;;
- ;;; <impspec> -> ( <import> , ... , <import> )
- ;;; -> hiding ( <import> , ... , <import> )
- ;;;
- ;;; <import> -> <entity>
- ;;;
- ;;; <renamings> -> ( <renaming>, ... , <renaming> )
- ;;;
- ;;; <renaming> -> <varid> to <varid>
- ;;; -> <conid> to <conid>
-
- (define-struct import-decl
- (include ast-node)
- (slots
- ;; <modid>, module imported from
- (module-name (type symbol))
- ;; all: import Foo; by-name: import Foo(x) import Foo()
- (mode (type (enum all by-name)))
- ;; <impspec>, for mode = all this is the hiding list
- (specs (type (list entity)))
- ;; <renamings>, alist maps symbol -> symbol
- (renamings (type (list renaming)))
- ;; place to put corresponding module-ast; filled in by import/export.
- (module (type module) (uninitialized? #t))
- ))
-
-
- ;;; <entity> -> <modid> .. entity-module
- ;; -> <varid> entity-var
- ;;; -> <tycon> entity-con
- ;;; -> <tycon> (..) entity-abbreviated
- ;;; -> <tycon> ( <conid> , ... , <conid>) entity-datatype
- ;;; -> <tycls> (..) entity-abbreviated
- ;;; note: this is indistinguishable from tycon (..)
- ;;; -> <tycls> ( <varid> , ... , <varid>) entity-class
-
- (define-struct entity
- (include ast-node)
- (slots
- (name (type symbol))))
-
- (define-struct entity-module
- (include entity)
- (predicate entity-module?)
- (slots
- ;; a direct pointer to the referenced module added later
- (module (type module) (uninitialized? #t))
- ))
-
- (define-struct entity-var
- (include entity)
- (predicate entity-var?))
-
- (define-struct entity-con
- (include entity)
- (predicate entity-con?))
-
- (define-struct entity-abbreviated
- (include entity)
- (predicate entity-abbreviated?))
-
- (define-struct entity-class
- (include entity)
- (predicate entity-class?)
- (slots
- (methods (type (list symbol)))))
-
- (define-struct entity-datatype
- (include entity)
- (predicate entity-datatype?)
- (slots
- (constructors (type (list symbol)))))
-
- (define-struct renaming
- (include ast-node)
- (slots
- (from (type symbol))
- (to (type symbol))
- (referenced? (type bool))))
-
-
- ;;; <fix> -> infixl [<digit>] <ops>
- ;;; -> infixr [<digit>] <ops>
- ;;; -> infix [<digit>] <ops>
- ;;;
- ;;; <ops> -> <op> , ... , <op>
- ;;;
- ;;; <op> -> <varop>
- ;;; -> <conop>
-
- ;;; Not sure where to put this decl - jcp
- (define-struct fixity
- (include ast-node)
- (slots
- (associativity (type (enum l n r)))
- (precedence (type int))))
-
- (define-struct fixity-decl
- (include ast-node)
- (slots
- (fixity (type fixity))
- ;; <ops>
- (names (type (list symbol)))
- ))
-
-